package com.jock.zjaddressanddatepicker;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

import android.annotation.SuppressLint;
import android.util.Log;

import org.json.JSONArray;
import org.json.JSONObject;

/**
 * 日期时间转换工具
 *
 * @author 林祖健
 * @version 创建时间：2013-2-19 上午11:35:53
 */
public class TimeUtil {
    public static final String TAG = TimeUtil.class.getSimpleName();

    /**
     * 把一个毫秒数转化成时间字符串。格式为小时/分/秒/毫秒（如：24903600 --> 06小时55分03秒600毫秒）。
     *
     * @param millis   要转化的毫秒数。
     * @param isWhole  是否强制全部显示小时/分/秒/毫秒。
     * @param isFormat 时间数字是否要格式化，如果true：少位数前面补全；如果false：少位数前面不补全。
     * @return 返回时间字符串：小时/分/秒/毫秒的格式（如：24903600 --> 06小时55分03秒600毫秒）。
     * @author wangjie
     */
    private static final long ONE_MINUTE = 60000L;
    private static final long ONE_HOUR = 3600000L;
    private static final long ONE_DAY = 86400000L;
    private static final long ONE_WEEK = 604800000L;

    private static final String ONE_SECOND_AGO = "秒前";
    private static final String ONE_MINUTE_AGO = "分钟前";
    private static final String ONE_HOUR_AGO = "小时前";
    private static final String ONE_DAY_AGO = "天前";
    private static final String ONE_MONTH_AGO = "月前";
    private static final String ONE_YEAR_AGO = "年前";

    public static String millisToString(long millis, boolean isWhole, boolean isFormat) {
        String h = "";
        String m = "";
        String s = "";
        String mi = "";
        if (isWhole) {
            h = isFormat ? "00小时" : "0小时";
            m = isFormat ? "00分" : "0分";
            s = isFormat ? "00秒" : "0秒";
            mi = isFormat ? "00毫秒" : "0毫秒";
        }

        long temp = millis;

        long hper = 60 * 60 * 1000;
        long mper = 60 * 1000;
        long sper = 1000;

        if (temp / hper > 0) {
            if (isFormat) {
                h = temp / hper < 10 ? "0" + temp / hper : temp / hper + "";
            } else {
                h = temp / hper + "";
            }
            h += "小时";
        }
        temp = temp % hper;

        if (temp / mper > 0) {
            if (isFormat) {
                m = temp / mper < 10 ? "0" + temp / mper : temp / mper + "";
            } else {
                m = temp / mper + "";
            }
            m += "分";
        }
        temp = temp % mper;

        if (temp / sper > 0) {
            if (isFormat) {
                s = temp / sper < 10 ? "0" + temp / sper : temp / sper + "";
            } else {
                s = temp / sper + "";
            }
            s += "秒";
        }
        temp = temp % sper;
        mi = temp + "";

        if (isFormat) {
            if (temp < 100 && temp >= 10) {
                mi = "0" + temp;
            }
            if (temp < 10) {
                mi = "00" + temp;
            }
        }

        mi += "毫秒";
        return h + m + s + mi;
    }

    /**
     * 把一个毫秒数转化成时间字符串。格式为小时/分/秒/毫秒（如：24903600 --> 06小时55分03秒）。
     *
     * @param millis   要转化的毫秒数。
     * @param isWhole  是否强制全部显示小时/分/秒/毫秒。
     * @param isFormat 时间数字是否要格式化，如果true：少位数前面补全；如果false：少位数前面不补全。
     * @return 返回时间字符串：小时/分/秒/毫秒的格式（如：24903600 --> 06小时55分03秒）。
     * @author wangjie
     */
    public static String millisToStringMiddle(long millis, boolean isWhole, boolean isFormat) {
        return millisToStringMiddle(millis, isWhole, isFormat, "小时", "分钟", "秒");
    }

    public static String millisToStringMiddle(long millis, boolean isWhole, boolean isFormat, String hUnit, String mUnit, String sUnit) {
        String h = "";
        String m = "";
        String s = "";
        if (isWhole) {
            h = isFormat ? "00" + hUnit : "0" + hUnit;
            m = isFormat ? "00" + mUnit : "0" + mUnit;
            s = isFormat ? "00" + sUnit : "0" + sUnit;
        }

        long temp = millis;

        long hper = 60 * 60 * 1000;
        long mper = 60 * 1000;
        long sper = 1000;

        if (temp / hper > 0) {
            if (isFormat) {
                h = temp / hper < 10 ? "0" + temp / hper : temp / hper + "";
            } else {
                h = temp / hper + "";
            }
            h += hUnit;
        }
        temp = temp % hper;

        if (temp / mper > 0) {
            if (isFormat) {
                m = temp / mper < 10 ? "0" + temp / mper : temp / mper + "";
            } else {
                m = temp / mper + "";
            }
            m += mUnit;
        }
        temp = temp % mper;

        if (temp / sper > 0) {
            if (isFormat) {
                s = temp / sper < 10 ? "0" + temp / sper : temp / sper + "";
            } else {
                s = temp / sper + "";
            }
            s += sUnit;
        }
        return h + m + s;
    }

    /**
     * 把一个毫秒数转化成时间字符串。格式为小时/分/秒/毫秒（如：24903600 --> 06小时55分钟）。
     *
     * @param millis   要转化的毫秒数。
     * @param isWhole  是否强制全部显示小时/分。
     * @param isFormat 时间数字是否要格式化，如果true：少位数前面补全；如果false：少位数前面不补全。
     * @return 返回时间字符串：小时/分/秒/毫秒的格式（如：24903600 --> 06小时55分钟）。
     * @author wangjie
     */
    @SuppressWarnings("unused")
    public static String millisToStringShort(long millis, boolean isWhole, boolean isFormat) {
        String h = "";
        String m = "";
        if (isWhole) {
            h = isFormat ? "00小时" : "0小时";
            m = isFormat ? "00分钟" : "0分钟";
        }

        long temp = millis;

        long hper = 60 * 60 * 1000;
        long mper = 60 * 1000;
        long sper = 1000;

        if (temp / hper > 0) {
            if (isFormat) {
                h = temp / hper < 10 ? "0" + temp / hper : temp / hper + "";
            } else {
                h = temp / hper + "";
            }
            h += "小时";
        }
        temp = temp % hper;

        if (temp / mper > 0) {
            if (isFormat) {
                m = temp / mper < 10 ? "0" + temp / mper : temp / mper + "";
            } else {
                m = temp / mper + "";
            }
            m += "分钟";
        }

        return h + m;
    }

    /**
     * 把日期毫秒转化为字符串。默认格式：yyyy-MM-dd HH:mm:ss。
     *
     * @param millis 要转化的日期毫秒数。
     * @return 返回日期字符串（如："2013-02-19 11:48:31"）。
     * @author wangjie
     */
    public static String millisToStringDate(long millis) {
        return millisToStringDate(millis, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 把日期毫秒转化为字符串。
     *
     * @param millis  要转化的日期毫秒数。
     * @param pattern 要转化为的字符串格式（如：yyyy-MM-dd HH:mm:ss）。
     * @return 返回日期字符串。
     * @author wangjie
     */
    public static String millisToStringDate(long millis, String pattern) {
        SimpleDateFormat format = new SimpleDateFormat(pattern);
        return format.format(new Date(millis));

    }

    /**
     * 把日期毫秒转化为字符串（文件名）。
     *
     * @param millis  要转化的日期毫秒数。
     * @param pattern 要转化为的字符串格式（如：yyyy-MM-dd HH:mm:ss）。
     * @return 返回日期字符串（yyyy_MM_dd_HH_mm_ss）。
     * @author wangjie
     */
    @SuppressLint("SimpleDateFormat")
    public static String millisToStringFilename(long millis, String pattern) {
        String dateStr = millisToStringDate(millis, pattern);
        return dateStr.replaceAll("[- :]", "_");
    }

    /**
     * 把日期毫秒转化为字符串（文件名）。
     *
     * @param millis 要转化的日期毫秒数。
     * @return 返回日期字符串（yyyy_MM_dd_HH_mm_ss）。
     * @author wangjie
     */
    public static String millisToStringFilename(long millis) {
        String dateStr = millisToStringDate(millis, "yyyy-MM-dd HH:mm:ss");
        return dateStr.replaceAll("[- :]", "_");
    }


    public static long oneHourMillis = 60 * 60 * 1000; // 一小时的毫秒数
    public static long oneDayMillis = 24 * oneHourMillis; // 一天的毫秒数
    public static long oneYearMillis = 365 * oneDayMillis; // 一年的毫秒数

    /**
     * 时间格式：
     * 1小时内用，多少分钟前；
     * 超过1小时，显示时间而无日期；
     * 如果是昨天，则显示昨天
     * 超过昨天再显示日期；
     * 超过1年再显示年。
     *
     * @param millis
     * @return
     */
    public static String millisToLifeString(long millis) {
        long now = System.currentTimeMillis();
        long todayStart = string2Millis(millisToStringDate(now, "yyyy-MM-dd"), "yyyy-MM-dd");

        if (now - millis <= oneHourMillis && now - millis > 0l) { // 一小时内
            String m = millisToStringShort(now - millis, false, false);
            return "".equals(m) ? "1分钟内" : m + "前";
        }

        if (millis >= todayStart && millis <= oneDayMillis + todayStart) { // 大于今天开始开始值，小于今天开始值加一天（即今天结束值）
            return "今天 " + millisToStringDate(millis, "HH:mm");
        }

        if (millis > todayStart - oneDayMillis) { // 大于（今天开始值减一天，即昨天开始值）
            return "昨天 " + millisToStringDate(millis, "HH:mm");
        }

        long thisYearStart = string2Millis(millisToStringDate(now, "yyyy"), "yyyy");
        if (millis > thisYearStart) { // 大于今天小于今年
            return millisToStringDate(millis, "MM月dd日 HH:mm");
        }

        return millisToStringDate(millis, "yyyy年MM月dd日 HH:mm");
    }
    /**
     * 时间格式：
     * 超过多少天
     * @return
     */
    public static boolean isAboveDays(long secondMillis,long firstMillis,int days) {
    	
    	if (secondMillis-firstMillis>oneDayMillis*days) { // 大于（今天开始值减一天，即昨天开始值）
    		return true;
    	}
    	
    	return false;
    }

    /**
     * 时间格式：
     * 今天，显示时间而无日期；
     * 如果是昨天，则显示昨天
     * 超过昨天再显示日期；
     * 超过1年再显示年。
     *
     * @param millis
     * @return
     */
    public static String millisToLifeString2(long millis) {
        long now = System.currentTimeMillis();
        long todayStart = string2Millis(millisToStringDate(now, "yyyy-MM-dd"), "yyyy-MM-dd");

        if (millis > todayStart + oneDayMillis && millis < todayStart + 2 * oneDayMillis) { // 明天
            return "明天" + millisToStringDate(millis, "HH:mm");
        }
        if (millis > todayStart + 2 * oneDayMillis && millis < todayStart + 3 * oneDayMillis) { // 后天
            return "后天" + millisToStringDate(millis, "HH:mm");
        }

        if (millis >= todayStart && millis <= oneDayMillis + todayStart) { // 大于今天开始开始值，小于今天开始值加一天（即今天结束值）
            return "今天 " + millisToStringDate(millis, "HH:mm");
        }

        if (millis > todayStart - oneDayMillis && millis < todayStart) { // 大于（今天开始值减一天，即昨天开始值）
            return "昨天 " + millisToStringDate(millis, "HH:mm");
        }

        long thisYearStart = string2Millis(millisToStringDate(now, "yyyy"), "yyyy");
        if (millis > thisYearStart) { // 大于今天小于今年
            return millisToStringDate(millis, "M月d日 HH:mm");
        }

        return millisToStringDate(millis, "yyyy年M月d日 HH:mm");
    }


    /**
     * @param millis
     * @return
     * @description 显示时间 x秒前，x分钟前，x小时前，x天前，x年前
     * @version CP1.0
     * @author 林祖健
     * @update 2015-5-5 下午12:00:01
     */
    public static String perTimeformat(long millis) {
        long delta = System.currentTimeMillis() - millis;
        if (delta < 1L * ONE_MINUTE) {
            long seconds = toSeconds(delta);
            return (seconds <= 0 ? 1 : seconds) + ONE_SECOND_AGO;
        }
        if (delta < 45L * ONE_MINUTE) {
            long minutes = toMinutes(delta);
            return (minutes <= 0 ? 1 : minutes) + ONE_MINUTE_AGO;
        }
        if (delta < 24L * ONE_HOUR) {
            long hours = toHours(delta);
            return (hours <= 0 ? 1 : hours) + ONE_HOUR_AGO;
        }
        if (delta < 48L * ONE_HOUR) {
            return "昨天";
        }
        if (delta < 30L * ONE_DAY) {
            long days = toDays(delta);
            return (days <= 0 ? 1 : days) + ONE_DAY_AGO;
        }
        if (delta < 12L * 4L * ONE_WEEK) {
            long months = toMonths(delta);
            return (months <= 0 ? 1 : months) + ONE_MONTH_AGO;
        } else {
            long years = toYears(delta);
            return (years <= 0 ? 1 : years) + ONE_YEAR_AGO;
        }
    }
    /**
     * @param millis
     * @return
     * @description 显示时间 x秒前，x分钟前，10：20， 昨天， 2015-1-12
     * @version CP1.0
     * @author 林祖健
     * @update 2016-06-28 18:25:43
     */
    public static String perTimeformat2(long millis) {
    	long delta = System.currentTimeMillis() - millis;
    	if (delta < 1L * ONE_MINUTE) {
    		long seconds = toSeconds(delta);
    		return (seconds <= 0 ? 1 : seconds) + ONE_SECOND_AGO;
    	}
    	if (delta < 45L * ONE_MINUTE) {
    		long minutes = toMinutes(delta);
    		return (minutes <= 0 ? 1 : minutes) + ONE_MINUTE_AGO;
    	}
    	if (delta < 24L * ONE_HOUR) {
    		long hours = toHours(delta);
    		return (hours <= 0 ? 1 : hours) + ONE_HOUR_AGO;
    	}
    	if (delta < 48L * ONE_HOUR) {
    		return "昨天";
    	}
    	return millisToStringDate(millis, "yyyy-MM-dd HH:mm");
    }

    private static long toSeconds(long date) {
        return date / 1000L;
    }

    private static long toMinutes(long date) {
        return toSeconds(date) / 60L;
    }

    private static long toHours(long date) {
        return toMinutes(date) / 60L;
    }

    private static long toDays(long date) {
        return toHours(date) / 24L;
    }

    private static long toMonths(long date) {
        return toDays(date) / 30L;
    }

    private static long toYears(long date) {
        return toMonths(date) / 365L;
    }


    /**
     * 时间格式：
     * 今天，显示时间而无日期；
     * 如果是昨天，则显示昨天
     * 超过昨天再显示日期；
     * 超过1年再显示年。
     *
     * @param millis
     * @return
     */
    public static String millisToLifeString3(long millis) {
        long now = System.currentTimeMillis();
        long todayStart = string2Millis(millisToStringDate(now, "yyyy-MM-dd"), "yyyy-MM-dd");

        if (millis > todayStart + oneDayMillis && millis < todayStart + 2 * oneDayMillis) { // 明天
            return "明天";
        }
        if (millis > todayStart + 2 * oneDayMillis && millis < todayStart + 3 * oneDayMillis) { // 后天
            return "后天";
        }

        if (millis >= todayStart && millis <= oneDayMillis + todayStart) { // 大于今天开始开始值，小于今天开始值加一天（即今天结束值）
            return millisToStringDate(millis, "HH:mm");
        }

        if (millis > todayStart - oneDayMillis && millis < todayStart) { // 大于（今天开始值减一天，即昨天开始值）
            return "昨天 ";
        }

        return millisToStringDate(millis, "MM月dd日");
    }

    /**
     * 字符串解析成毫秒数
     *
     * @param str
     * @param pattern
     * @return
     */
    public static long string2Millis(String str, String pattern) {
        SimpleDateFormat format = new SimpleDateFormat(pattern);
        long millis = 0;
        try {
            millis = format.parse(str).getTime();
        } catch (ParseException e) {
            Log.e(TAG, e.getMessage());
        }
        return millis;
    }

    @SuppressLint("SimpleDateFormat")
    public static ArrayList<String> getYearList() {
        ArrayList<String> yList = new ArrayList<String>();
        for (int i = 1960; i <= 2018; i++) {
            yList.add(i + "");
        }
        return yList;
    }

    public static ArrayList<String> getMonthList() {
        ArrayList<String> mList = new ArrayList<String>();
        for (int i = 1; i <= 12; i++) {
            if (i <= 9) {
                mList.add("0" + i);
            } else {
                mList.add("" + i);
            }
        }
        return mList;
    }

    public static ArrayList<String> getDayList() {
        ArrayList<String> dList = new ArrayList<String>();
        for (int i = 1; i <= 31; i++) {
            if (i <= 9) {
                dList.add("0" + i);
            } else {
                dList.add("" + i);
            }
        }
        return dList;
    }

    public static ArrayList<String> getHeightList() {
        ArrayList<String> hList = new ArrayList<String>();
        for (int i = 130; i <= 210; i++) {

            hList.add(i + "");
        }
        return hList;
    }

    /**
     * 获得今天开始的毫秒值
     *
     * @return
     */
    public static long getTodayStartMillis() {
//        String dateStr = millisToStringDate(System.currentTimeMillis(), "yyyy-MM-dd");
//        return string2Millis(dateStr, "yyyy-MM-dd");
        return getOneDayStartMillis(System.currentTimeMillis());
    }

    public static long getOneDayStartMillis(long millis) {
        String dateStr = millisToStringDate(millis, "yyyy-MM-dd");
        return string2Millis(dateStr, "yyyy-MM-dd");
    }

    /**
     * @return 日期和时间（如 20150425175621）
     * @description 获取当前的时间戳
     * @version CP1.0
     * @author 林祖健
     * @update 2015-4-25 下午5:55:17
     */
    public static String getCurrentTimeMillisString() {
        return millisToStringDate(System.currentTimeMillis(), "yyyyMMddHHmmss");
    }

    /**
     * 获取毫秒
     * @param date
     * @return
     */
    public static long getMillis(Date date){
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));
        return c.getTimeInMillis();
    }

    /**
     * 根据时间获取 几月几日 星期几
     *
     * @param date
     * @return
     */
    public static String dateFormatWeeken(Date date, int haveYear) {
        String mYear;
        String mMonth;
        String mDay;
        String mWay;
        String dateStr = "";
        final Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));
        mYear = String.valueOf(c.get(Calendar.YEAR)); // 获取当前年份
        mMonth = String.valueOf(c.get(Calendar.MONTH) + 1);// 获取当前月份
        mDay = String.valueOf(c.get(Calendar.DAY_OF_MONTH));// 获取当前月份的日期号码
        mWay = String.valueOf(c.get(Calendar.DAY_OF_WEEK));
        if ("1".equals(mWay)) {
            mWay = "日";
        } else if ("2".equals(mWay)) {
            mWay = "一";
        } else if ("3".equals(mWay)) {
            mWay = "二";
        } else if ("4".equals(mWay)) {
            mWay = "三";
        } else if ("5".equals(mWay)) {
            mWay = "四";
        } else if ("6".equals(mWay)) {
            mWay = "五";
        } else if ("7".equals(mWay)) {
            mWay = "六";
        }
        switch (haveYear) {
            case 0:
                dateStr = mMonth + "月" + mDay + "日" + " 星期" + mWay;
                break;
            case 1:
                dateStr = mYear + "年" + mMonth + "月" + mDay + "日" + " 星期" + mWay;
                break;
        }
        return dateStr;
    }

    /**
     * 提取月份
     * @param dates
     * @return
     */
    public static String[] getMonthList(JSONArray dates) {
        String[] months = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""};
        try {
            int len = dates.length();
            String month = "";
            for (int i = 0; i < len; i++) {
                JSONObject info = dates.getJSONObject(i);
                month = millisToStringDate(string2Millis(info.getString("BeginDateTime"), "yyyy年MM月dd日 HH时mm分"), "MM");
                if (month.equals("01")) {
                    months[0] = "01月";
                } else if (month.equals("02")) {
                    months[1] = "02月";
                } else if (month.equals("03")) {
                    months[2] = "03月";
                } else if (month.equals("04")) {
                    months[3] = "04月";
                } else if (month.equals("05")) {
                    months[4] = "05月";
                } else if (month.equals("06")) {
                    months[5] = "06月";
                } else if (month.equals("07")) {
                    months[6] = "07月";
                } else if (month.equals("08")) {
                    months[7] = "08月";
                } else if (month.equals("09")) {
                    months[8] = "09月";
                } else if (month.equals("10")) {
                    months[9] = "10月";
                } else if (month.equals("11")) {
                    months[10] = "11月";
                } else if (month.equals("12")) {
                    months[11] = "12月";
                }
            }
        } catch (Exception e) {
        }
        return months;
    }
    
    /**
     * 比较两个时间前后
     * 1:date1大于date2
     * 0:等于
     * -1:date1小于date2,
     *
     * @param date1
     * @param date2
     * @return
     */
    public static int compareDate(String date1, String date2, String format) {

        Calendar c1 = Calendar.getInstance();
        Calendar c2 = Calendar.getInstance();
        c1.setTime(getDate(date1, format));
        c2.setTime(getDate(date2, format));

        int result = c1.compareTo(c2);
        if (result > 0) {
            return 1;
        } else if (result < 0) {
            return -1;
        } else if (result == 0) {
            return 0;
        }
        return 1;
    }
    
    /**
     * 得到date日期的date对象
     */
    public static Date getDate(String date, String format) {
        SimpleDateFormat mSdf = new SimpleDateFormat(format);
        Date mDate = null;
        try {
            mDate = mSdf.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return mDate;
    }

}